A storage system is a computer that provides storage service relating to the organization of information on writeable persistent storage devices, such as memories, tapes or disks. The storage system is commonly deployed within a storage area network (SAN) or a network attached storage (NAS) environment. When used within a NAS environment, the storage system may be embodied as a file server including a storage operating system that implements a file system to logically organize the information as a hierarchical structure of directories and files on, e.g. the disks. Each “on-disk” file may be implemented as a set of data structures, e.g., disk blocks, configured to store information, such as the actual data for the file. A directory, on the other hand, may be implemented as a specially formatted file in which information about other files and directories are stored.
The file server, or filer, may be further configured to operate according to a client/server model of information delivery to thereby allow many client systems (clients) to access shared resources, such as files, stored on the filer. Sharing of files is a hallmark of a NAS system, which is enabled because of semantic level access to files and file systems. Storage of information on a NAS system is typically deployed over a computer network comprising a geographically distributed collection of interconnected communication links, such as Ethernet, that allow clients to remotely access the information (files) stored on the file server. The clients typically communicate with the filer by exchanging discrete frames or packets of data according to pre-defined protocols, such as the well-known Transmission Control Protocol/Internet Protocol (TCP/IP).
In the client/server model, the client may comprise an application executing on a computer that “connects” to the filer over a computer network, such as a point-to-point link, shared local area network, wide area network or virtual private network implemented over a public network, such as the well-known Internet. NAS systems generally utilize file-based access protocols; therefore, each client may request the services of the filer by issuing file system protocol messages (in the form of packets) to the file system over the network. By supporting a plurality of file system protocols, such as the conventional Common Internet File System (CIFS), the Network File System (NFS) and the Direct Access File System (DAFS) protocols, the utility of the filer may be enhanced for networking clients.
Conversely, a SAN is a high-speed network that enables establishment of direct connections between a storage system and its storage devices. The SAN may thus be is viewed as an extension to a storage bus and, as such, a storage operating system of the storage system enables access to stored information exported as, e.g., logical unit numbers (luns), using block-based access protocols over the “extended bus.” In this context, the extended bus is typically embodied as Fibre Channel (FC) or Ethernet media adapted to operate with block access protocols, such as Small Computer Systems Interface (SCSI) protocol encapsulation over FC (FCP) or TCP/IP/Ethernet (iSCSI). A SAN arrangement or deployment allows decoupling of storage from the storage system, such as an application server, and some level of storage sharing at the application server level. There are, however, environments wherein a SAN is dedicated to a single server.
Conventionally, the storage system utilizes one or more FC host bus adapters (HBA) for interfacing with the FC media and clients of the storage system. Each HBA includes a set number of queues, such as 1024, for use in processing data access requests issued by the clients. Each data access request occupies one of the queues while the data access operation is specified by the request performed by the storage system. A noted problem with this arrangement art is a possibility of starvation of queues when the storage system is heavily utilized. Starvation occurs when, for example, all of the queues on an HBA are utilized by active clients that are sending large numbers of data access requests to the storage system. Active clients typically issue additional data access requests as soon as one of their previously pending requests completes. As a result, other less active clients may not have their access data requests processed and thus are prevented from utilizing storage system resources.
A solution to the starvation problem involves configuring a per adapter (HBA) “throttle” value. In the context “throttle” denotes a predetermined number of queues that may be allocated to the client. For example, if an HBA has 512 queues available for utilization by four clients, each client may be allocated 128 queues and have a corresponding throttle value of 128. However, there are a number of noted disadvantages with such a “client-side” throttle configuration solution. Specifically, each client is typically configured manually with an appropriate throttle value. Accordingly, whenever a client is added or removed from service by the storage system, all remaining clients require manual (re) configuration of their throttle values. Such manual configuration does not permit optimum storage system performance when, for example, a particular client is not utilizing its preallocated number of HBA queues. Because each client is manually configured with its throttle value, any unused queues may not be utilized by other clients of the storage system, even if the other clients experience an overly heavy load. This results in non-optimal system performance.